knitr::opts_chunk$set(echo = TRUE)
rm(list = ls())

most recent data Ayano shared

data <- read.csv("~/Rprojects/ayano/PES_010v6(selected).csv")
colnames(data)
 [1] "Index"       "ID"          "Speaker"     "Phase"       "TimePhase"   "Role"       
 [7] "Japanese"    "English"     "Functions"   "Aesthetics"  "User"        "Vision"     
[13] "Prototyping" "CA"          "ALoK"        "CSU"         "GCA"         "Projective" 
[19] "Regulative"  "Relational" 
#time phase is tSSNA
units <- c("Speaker", "Role", "TimePhase")

codes_1 <- c("Functions", "Aesthetics", "User", "Vision", "Prototyping") # design actions codes
codes_2 <- c("CA", "ALoK", "CSU", "GCA", "Projective","Regulative","Relational") # shared epistemic agency codes

hoo_rules <- conversation_rules(
  (TimePhase %in% UNIT$TimePhase & Role %in% UNIT$Role)
)

notes: accum_1 and set_1 are for design action codes; accum_2 and set_2 are for shared epistemic agency codes

accum_1 <-
  contexts(data, 
           units_by = units, 
           hoo_rules = hoo_rules) %>%
  accumulate_contexts(codes = codes_1, 
                      decay.function = decay(simple_window, window_size = 4),
                      return.ena.set = FALSE, norm.by = NULL)

Note: Not doing means rotation so I can compare everything in the same space

set_1 <-
  # model(accum_1,
  #       rotate.using = "mean",
  #       rotation.params = 
  #         list(engineers=accum_1$meta.data$Role=="Engineer",
  #              servicedesigners=accum_1$meta.data$Role=="ServiceDesigner"))
  
  model(accum_1)
accum_2 <-
  contexts(data, 
           units_by = units, 
           hoo_rules = hoo_rules) %>%
  accumulate_contexts(codes = codes_2, 
                      decay.function = decay(simple_window, window_size = 4),
                      return.ena.set = FALSE, norm.by = NULL)
set_2 <-
  # model(accum_2,
  #       rotate.using = "mean",
  #       rotation.params = 
  #         list(engineers=accum_2$meta.data$Role=="Engineer",
  #              servicedesigners=accum_2$meta.data$Role=="ServiceDesigner"))
  
  model(accum_2)

you can save set so you don’t have to run lines above next time

saveRDS(set_1, "ayano_set_1_design_codes.RDS")
saveRDS(set_2, "ayano_set_2_epistemic_codes.RDS")

global visual parameter (let’s make sure all the plots use the same level of multiplier)

node_size_multiplier = 0.3 # scale up or down node sizes
node_position_multiplier = 1 # zoom in or out node positions
point_position_multiplier = 1 # zoom in or out the point positions
edge_arrow_saturation_multiplier = 1.5 # adjust the chevron color lighter or darker
edge_size_multiplier = 1 # scale up or down edge sizes

Model 1: design action codes

Plot 1: Mean Network

plot(set_1, title = "Overall Mean") |>
  units(
    points= set_1$points, 
    point_position_multiplier = point_position_multiplier,
    points_color = c("black"),
    show_mean = TRUE, show_points = TRUE, with_ci = TRUE) |>
  edges(
    weights =set_1$line.weights,
    edge_size_multiplier = edge_size_multiplier,
    edge_arrow_saturation_multiplier = edge_arrow_saturation_multiplier,
    node_position_multiplier = node_position_multiplier,
    edge_color = c("black")) |>
  nodes(
    node_size_multiplier = node_size_multiplier,
    node_position_multiplier = node_position_multiplier,
    node_labels = TRUE, # change this to FALSE can remove node labels in case you want to add them back in a nicer font or size for your presentations or publications
    self_connection_color = c("black"))

Plot 2: All Means


#get list of time phases and groups loop over or use map function

phases = unique(set_1$points$TimePhase)

groups = unique(set_1$points$Role)

# col_list = list(pd = list("darkolivegreen2","darkolivegreen3","darkolivegreen4"),
#                 en = list("darkorange2","darkorange3","darkorange4"),
#                 sd = list("darkorchid1","darkorchid2","darkorchid3"))

col_list_2 = c("red",
              "blue",
              "green")

# pd_colors = c("darkolivegreen2", "darkolivegreen3","darkolivegreen4")
# 
# en_colors = c("darkorange2","darkorange3","darkorange4")
# 
# sd_colors = c("darkorchid1","darkorchid2","darkorchid3")

x = plot(set_1, title = "Group Means by Phase")

for (i in 1:length(phases)){
  for (j in 1:length(groups)){
    points = set_1$points %>% filter(TimePhase == phases[i], Role == groups[j])
    #print(head(points))
    x = x |>
      units(
        points = points,
        point_position_multiplier = point_position_multiplier,
        points_color = col_list_2[i],
        show_mean = TRUE, show_points = F, with_ci = FALSE
        ) |>
      nodes(node_size_multiplier = 0.3,
            node_position_multiplier = node_position_multiplier,
            self_connection_color = c("black"))
    
    
    #|>
     # plotly::layout(showlegend = TRUE, 
                    # legend = list(x = 100, y = 0.9)
                   #  ) |>
      #plotly::style(name = "test")
  }
}




#x |> nodes(self_connection_color = "black") 
x

      
# x = plot(set_1, title = "Group Means by Phase")
# points = set_1$points %>% filter(TimePhase == 1, Role == "Engineer")
# 
# x |>
#   units(
#     points= points,
#     point_position_multiplier = point_position_multiplier,
#     points_color = "darkolivegreen2",
#     show_mean = TRUE, show_points = TRUE, with_ci = TRUE)

Stats:

reg_dat = set_1$points %>% filter(ENA_DIRECTION == "response")

mod_x = lm(SVD1 ~ as.factor(TimePhase) + Role, data = reg_dat)
mod_y = lm(SVD2 ~ as.factor(TimePhase) + Role, data = reg_dat)


summary(mod_x)

Call:
lm(formula = SVD1 ~ as.factor(TimePhase) + Role, data = reg_dat)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.76220 -0.14794  0.01651  0.16133  0.41952 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)    
(Intercept)            -0.2908     0.1177  -2.470  0.01986 *  
as.factor(TimePhase)2   0.6750     0.1282   5.264 1.35e-05 ***
as.factor(TimePhase)3   1.0700     0.1315   8.135 7.42e-09 ***
RoleProductDesigner    -0.2501     0.1342  -1.863  0.07292 .  
RoleServiceDesigner    -0.4814     0.1315  -3.660  0.00104 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.3067 on 28 degrees of freedom
Multiple R-squared:  0.7391,    Adjusted R-squared:  0.7018 
F-statistic: 19.83 on 4 and 28 DF,  p-value: 7.679e-08
summary(mod_y)

Call:
lm(formula = SVD2 ~ as.factor(TimePhase) + Role, data = reg_dat)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.36587 -0.09981 -0.02285  0.08708  0.34466 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)  
(Intercept)           -0.02159    0.07648  -0.282   0.7798  
as.factor(TimePhase)2 -0.15071    0.08330  -1.809   0.0812 .
as.factor(TimePhase)3  0.16693    0.08545   1.953   0.0608 .
RoleProductDesigner    0.16092    0.08719   1.846   0.0755 .
RoleServiceDesigner   -0.08909    0.08545  -1.043   0.3061  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.1993 on 28 degrees of freedom
Multiple R-squared:  0.433, Adjusted R-squared:  0.3519 
F-statistic: 5.345 on 4 and 28 DF,  p-value: 0.002509

Marginal means - x

library(emmeans)

emm1 = emmeans(mod_x, specs = pairwise ~ TimePhase|Role, weights = "proportional")
#emm1 = emmeans(mod_x, ~ Role*TimePhase)
#emm1$emmeans
emm1$contrasts
Role = Engineer:
 contrast                estimate    SE df t.ratio p.value
 TimePhase1 - TimePhase2   -0.675 0.128 28  -5.264  <.0001
 TimePhase1 - TimePhase3   -1.070 0.132 28  -8.135  <.0001
 TimePhase2 - TimePhase3   -0.395 0.134 28  -2.943  0.0172

Role = ProductDesigner:
 contrast                estimate    SE df t.ratio p.value
 TimePhase1 - TimePhase2   -0.675 0.128 28  -5.264  <.0001
 TimePhase1 - TimePhase3   -1.070 0.132 28  -8.135  <.0001
 TimePhase2 - TimePhase3   -0.395 0.134 28  -2.943  0.0172

Role = ServiceDesigner:
 contrast                estimate    SE df t.ratio p.value
 TimePhase1 - TimePhase2   -0.675 0.128 28  -5.264  <.0001
 TimePhase1 - TimePhase3   -1.070 0.132 28  -8.135  <.0001
 TimePhase2 - TimePhase3   -0.395 0.134 28  -2.943  0.0172

P value adjustment: tukey method for comparing a family of 3 estimates 
#write.csv(emm1$contrasts,"emm_1_x.csv")

Marginal means - y

emm2$contrasts
 contrast                                                estimate     SE df t.ratio
 Engineer TimePhase1 - ProductDesigner TimePhase1        -0.16092 0.0872 28  -1.846
 Engineer TimePhase1 - ServiceDesigner TimePhase1         0.08909 0.0855 28   1.043
 Engineer TimePhase1 - Engineer TimePhase2                0.15071 0.0833 28   1.809
 Engineer TimePhase1 - ProductDesigner TimePhase2        -0.01021 0.1176 28  -0.087
 Engineer TimePhase1 - ServiceDesigner TimePhase2         0.23981 0.1164 28   2.060
 Engineer TimePhase1 - Engineer TimePhase3               -0.16693 0.0855 28  -1.953
 Engineer TimePhase1 - ProductDesigner TimePhase3        -0.32785 0.1220 28  -2.688
 Engineer TimePhase1 - ServiceDesigner TimePhase3        -0.07784 0.1179 28  -0.660
 ProductDesigner TimePhase1 - ServiceDesigner TimePhase1  0.25002 0.0833 28   3.001
 ProductDesigner TimePhase1 - Engineer TimePhase2         0.31164 0.1235 28   2.524
 ProductDesigner TimePhase1 - ProductDesigner TimePhase2  0.15071 0.0833 28   1.809
 ProductDesigner TimePhase1 - ServiceDesigner TimePhase2  0.40073 0.1179 28   3.399
 ProductDesigner TimePhase1 - Engineer TimePhase3        -0.00601 0.1222 28  -0.049
 ProductDesigner TimePhase1 - ProductDesigner TimePhase3 -0.16693 0.0855 28  -1.953
 ProductDesigner TimePhase1 - ServiceDesigner TimePhase3  0.08308 0.1164 28   0.714
 ServiceDesigner TimePhase1 - Engineer TimePhase2         0.06162 0.1222 28   0.504
 ServiceDesigner TimePhase1 - ProductDesigner TimePhase2 -0.09930 0.1177 28  -0.843
 ServiceDesigner TimePhase1 - ServiceDesigner TimePhase2  0.15071 0.0833 28   1.809
 ServiceDesigner TimePhase1 - Engineer TimePhase3        -0.25603 0.1237 28  -2.069
 ServiceDesigner TimePhase1 - ProductDesigner TimePhase3 -0.41695 0.1222 28  -3.413
 ServiceDesigner TimePhase1 - ServiceDesigner TimePhase3 -0.16693 0.0855 28  -1.953
 Engineer TimePhase2 - ProductDesigner TimePhase2        -0.16092 0.0872 28  -1.846
 Engineer TimePhase2 - ServiceDesigner TimePhase2         0.08909 0.0855 28   1.043
 Engineer TimePhase2 - Engineer TimePhase3               -0.31765 0.0872 28  -3.643
 Engineer TimePhase2 - ProductDesigner TimePhase3        -0.47857 0.1260 28  -3.797
 Engineer TimePhase2 - ServiceDesigner TimePhase3        -0.22855 0.1220 28  -1.874
 ProductDesigner TimePhase2 - ServiceDesigner TimePhase2  0.25002 0.0833 28   3.001
 ProductDesigner TimePhase2 - Engineer TimePhase3        -0.15672 0.1205 28  -1.300
 ProductDesigner TimePhase2 - ProductDesigner TimePhase3 -0.31765 0.0872 28  -3.643
 ProductDesigner TimePhase2 - ServiceDesigner TimePhase3 -0.06763 0.1176 28  -0.575
 ServiceDesigner TimePhase2 - Engineer TimePhase3        -0.40674 0.1222 28  -3.329
 ServiceDesigner TimePhase2 - ProductDesigner TimePhase3 -0.56766 0.1235 28  -4.598
 ServiceDesigner TimePhase2 - ServiceDesigner TimePhase3 -0.31765 0.0872 28  -3.643
 Engineer TimePhase3 - ProductDesigner TimePhase3        -0.16092 0.0872 28  -1.846
 Engineer TimePhase3 - ServiceDesigner TimePhase3         0.08909 0.0855 28   1.043
 ProductDesigner TimePhase3 - ServiceDesigner TimePhase3  0.25002 0.0833 28   3.001
 p.value
  0.6535
  0.9778
  0.6761
  1.0000
  0.5182
  0.5853
  0.1975
  0.9989
  0.1073
  0.2633
  0.6761
  0.0452
  1.0000
  0.5853
  0.9982
  0.9999
  0.9942
  0.6761
  0.5123
  0.0439
  0.5853
  0.6535
  0.9778
  0.0256
  0.0177
  0.6359
  0.1073
  0.9229
  0.0256
  0.9996
  0.0530
  0.0023
  0.0256
  0.6535
  0.9778
  0.1073

P value adjustment: tukey method for comparing a family of 9 estimates 

Calculate eff sizes

Plot network subtractions for moderate to high eff sizes

Model 2: Epistemic Agency Codes

Plot 1: Mean Network

plot(set_2, title = "Overall Mean--Agency") |>
  units(
    points= set_2$points, 
    point_position_multiplier = point_position_multiplier,
    points_color = c("black"),
    show_mean = TRUE, show_points = TRUE, with_ci = TRUE) |>
  edges(
    weights =set_2$line.weights,
    edge_size_multiplier = edge_size_multiplier,
    edge_arrow_saturation_multiplier = edge_arrow_saturation_multiplier,
    node_position_multiplier = node_position_multiplier,
    edge_color = c("black")) |>
  nodes(
    node_size_multiplier = node_size_multiplier,
    node_position_multiplier = node_position_multiplier,
    node_labels = TRUE, # change this to FALSE can remove node labels in case you want to add them back in a nicer font or size for your presentations or publications
    self_connection_color = c("black"))

Plot 2: All Means


#get list of time phases and groups loop over or use map function

phases = unique(set_2$points$TimePhase)

groups = unique(set_2$points$Role)

# col_list = list(pd = list("darkolivegreen2","darkolivegreen3","darkolivegreen4"),
#                 en = list("darkorange2","darkorange3","darkorange4"),
#                 sd = list("darkorchid1","darkorchid2","darkorchid3"))

col_list_2 = c("red",
              "blue",
              "green")

x_agency = plot(set_2, title = "Group Means by Phase -- Agency")

for (i in 1:length(phases)){
  for (j in 1:length(groups)){
    points = set_2$points %>% filter(TimePhase == phases[i], Role == groups[j])
    #print(head(points))
    x_agency = x_agency |>
      units(
        points = points,
        point_position_multiplier = point_position_multiplier,
        points_color = col_list_2[i],
        show_mean = TRUE, show_points = F, with_ci = FALSE
        ) |>
      nodes(node_size_multiplier = 0.3,
            node_position_multiplier = node_position_multiplier,
            self_connection_color = c("black"))
    
    
    #|>
     # plotly::layout(showlegend = TRUE, 
                    # legend = list(x = 100, y = 0.9)
                   #  ) |>
      #plotly::style(name = "test")
  }
}

x_agency
reg_dat_agency = set_2$points %>% filter(ENA_DIRECTION == "response")

mod_x_agency = lm(SVD1 ~ as.factor(TimePhase) + Role, data = reg_dat_agency)
mod_y_agency = lm(SVD2 ~ as.factor(TimePhase) + Role, data = reg_dat_agency)


summary(mod_x_agency)

Call:
lm(formula = SVD1 ~ as.factor(TimePhase) + Role, data = reg_dat_agency)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.72619 -0.10243  0.00017  0.18426  0.34417 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)    
(Intercept)            -0.3092     0.1103  -2.804  0.00906 ** 
as.factor(TimePhase)2   0.6862     0.1201   5.713 3.97e-06 ***
as.factor(TimePhase)3   1.0597     0.1232   8.601 2.40e-09 ***
RoleProductDesigner    -0.2519     0.1257  -2.004  0.05486 .  
RoleServiceDesigner    -0.4308     0.1232  -3.496  0.00159 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.2873 on 28 degrees of freedom
Multiple R-squared:  0.7564,    Adjusted R-squared:  0.7216 
F-statistic: 21.74 on 4 and 28 DF,  p-value: 2.999e-08
summary(mod_y_agency)

Call:
lm(formula = SVD2 ~ as.factor(TimePhase) + Role, data = reg_dat_agency)

Residuals:
    Min      1Q  Median      3Q     Max 
-0.4179 -0.2658 -0.1107  0.2753  0.5530 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)   
(Intercept)            0.12309    0.12362   0.996  0.32793   
as.factor(TimePhase)2  0.01307    0.13464   0.097  0.92338   
as.factor(TimePhase)3 -0.05497    0.13812  -0.398  0.69364   
RoleProductDesigner   -0.50503    0.14093  -3.584  0.00127 **
RoleServiceDesigner    0.15828    0.13812   1.146  0.26151   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.3221 on 28 degrees of freedom
Multiple R-squared:  0.4817,    Adjusted R-squared:  0.4076 
F-statistic: 6.505 on 4 and 28 DF,  p-value: 0.0007821

Marginal means - x

library(emmeans)

emm1_agency = emmeans(mod_x_agency, specs = pairwise ~ Role:TimePhase, weights = "proportional")
#emm1 = emmeans(mod_x, ~ Role*TimePhase)
#emm1$emmeans
#emm1_agency$contrasts

write.csv(emm1_agency$contrasts,"emm_x_agency.csv")

Marginal means - y

emm2 = emmeans(mod_y_agency, specs = pairwise ~ Role:TimePhase, weights = "proportional")
#emm1 = emmeans(mod_x, ~ Role*TimePhase)
#emm2$emmeans
#emm2$contrasts
write.csv(emm2$contrasts,"emm_y_agency.csv")

Calculate eff sizes

Plot network subtractions for moderate to high eff sizes

LS0tCnRpdGxlOiAiSkxBMC0yMDIzIgphdXRob3I6ICJaYWNoICYgWXVhbnJ1IgpkYXRlOiAiMjAyMy0wNS0yMyIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCmVkaXRvcl9vcHRpb25zOiAKICBtYXJrZG93bjogCiAgICB3cmFwOiBzZW50ZW5jZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPVRSVUV9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKYGBgCgpgYGB7cn0Kcm0obGlzdCA9IGxzKCkpCmBgYAoKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkob25hKQpsaWJyYXJ5KHRtYSkKbGlicmFyeShtYWdyaXR0cikKbGlicmFyeSh0aWR5dmVyc2UpCmBgYAoKbW9zdCByZWNlbnQgZGF0YSBBeWFubyBzaGFyZWQKYGBge3J9CmRhdGEgPC0gcmVhZC5jc3YoIn4vUnByb2plY3RzL2F5YW5vL1BFU18wMTB2NihzZWxlY3RlZCkuY3N2IikKY29sbmFtZXMoZGF0YSkKCiN0aW1lIHBoYXNlIGlzIHRTU05BCmBgYAoKYGBge3J9CnVuaXRzIDwtIGMoIlNwZWFrZXIiLCAiUm9sZSIsICJUaW1lUGhhc2UiKQoKY29kZXNfMSA8LSBjKCJGdW5jdGlvbnMiLCAiQWVzdGhldGljcyIsICJVc2VyIiwgIlZpc2lvbiIsICJQcm90b3R5cGluZyIpICMgZGVzaWduIGFjdGlvbnMgY29kZXMKY29kZXNfMiA8LSBjKCJDQSIsICJBTG9LIiwgIkNTVSIsICJHQ0EiLCAiUHJvamVjdGl2ZSIsIlJlZ3VsYXRpdmUiLCJSZWxhdGlvbmFsIikgIyBzaGFyZWQgZXBpc3RlbWljIGFnZW5jeSBjb2RlcwoKaG9vX3J1bGVzIDwtIGNvbnZlcnNhdGlvbl9ydWxlcygKICAoVGltZVBoYXNlICVpbiUgVU5JVCRUaW1lUGhhc2UgJiBSb2xlICVpbiUgVU5JVCRSb2xlKQopCmBgYAoKbm90ZXM6IGFjY3VtXzEgYW5kIHNldF8xIGFyZSBmb3IgZGVzaWduIGFjdGlvbiBjb2RlczsgYWNjdW1fMiBhbmQgc2V0XzIgYXJlIGZvciBzaGFyZWQgZXBpc3RlbWljIGFnZW5jeSBjb2RlcwoKYGBge3J9CmFjY3VtXzEgPC0KICBjb250ZXh0cyhkYXRhLCAKICAgICAgICAgICB1bml0c19ieSA9IHVuaXRzLCAKICAgICAgICAgICBob29fcnVsZXMgPSBob29fcnVsZXMpICU+JQogIGFjY3VtdWxhdGVfY29udGV4dHMoY29kZXMgPSBjb2Rlc18xLCAKICAgICAgICAgICAgICAgICAgICAgIGRlY2F5LmZ1bmN0aW9uID0gZGVjYXkoc2ltcGxlX3dpbmRvdywgd2luZG93X3NpemUgPSA0KSwKICAgICAgICAgICAgICAgICAgICAgIHJldHVybi5lbmEuc2V0ID0gRkFMU0UsIG5vcm0uYnkgPSBOVUxMKQpgYGAKCgpOb3RlOiBOb3QgZG9pbmcgbWVhbnMgcm90YXRpb24gc28gSSBjYW4gY29tcGFyZSBldmVyeXRoaW5nIGluIHRoZSBzYW1lIHNwYWNlCgpgYGB7cn0Kc2V0XzEgPC0KICAjIG1vZGVsKGFjY3VtXzEsCiAgIyAgICAgICByb3RhdGUudXNpbmcgPSAibWVhbiIsCiAgIyAgICAgICByb3RhdGlvbi5wYXJhbXMgPSAKICAjICAgICAgICAgbGlzdChlbmdpbmVlcnM9YWNjdW1fMSRtZXRhLmRhdGEkUm9sZT09IkVuZ2luZWVyIiwKICAjICAgICAgICAgICAgICBzZXJ2aWNlZGVzaWduZXJzPWFjY3VtXzEkbWV0YS5kYXRhJFJvbGU9PSJTZXJ2aWNlRGVzaWduZXIiKSkKICAKICBtb2RlbChhY2N1bV8xKQpgYGAKCgpgYGB7cn0KYWNjdW1fMiA8LQogIGNvbnRleHRzKGRhdGEsIAogICAgICAgICAgIHVuaXRzX2J5ID0gdW5pdHMsIAogICAgICAgICAgIGhvb19ydWxlcyA9IGhvb19ydWxlcykgJT4lCiAgYWNjdW11bGF0ZV9jb250ZXh0cyhjb2RlcyA9IGNvZGVzXzIsIAogICAgICAgICAgICAgICAgICAgICAgZGVjYXkuZnVuY3Rpb24gPSBkZWNheShzaW1wbGVfd2luZG93LCB3aW5kb3dfc2l6ZSA9IDQpLAogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLmVuYS5zZXQgPSBGQUxTRSwgbm9ybS5ieSA9IE5VTEwpCmBgYAoKCmBgYHtyfQpzZXRfMiA8LQogICMgbW9kZWwoYWNjdW1fMiwKICAjICAgICAgIHJvdGF0ZS51c2luZyA9ICJtZWFuIiwKICAjICAgICAgIHJvdGF0aW9uLnBhcmFtcyA9IAogICMgICAgICAgICBsaXN0KGVuZ2luZWVycz1hY2N1bV8yJG1ldGEuZGF0YSRSb2xlPT0iRW5naW5lZXIiLAogICMgICAgICAgICAgICAgIHNlcnZpY2VkZXNpZ25lcnM9YWNjdW1fMiRtZXRhLmRhdGEkUm9sZT09IlNlcnZpY2VEZXNpZ25lciIpKQogIAogIG1vZGVsKGFjY3VtXzIpCmBgYAoKeW91IGNhbiBzYXZlIHNldCBzbyB5b3UgZG9uJ3QgaGF2ZSB0byBydW4gbGluZXMgYWJvdmUgbmV4dCB0aW1lCmBgYHtyfQpzYXZlUkRTKHNldF8xLCAiYXlhbm9fc2V0XzFfZGVzaWduX2NvZGVzLlJEUyIpCnNhdmVSRFMoc2V0XzIsICJheWFub19zZXRfMl9lcGlzdGVtaWNfY29kZXMuUkRTIikKYGBgCgoKZ2xvYmFsIHZpc3VhbCBwYXJhbWV0ZXIgKGxldCdzIG1ha2Ugc3VyZSBhbGwgdGhlIHBsb3RzIHVzZSB0aGUgc2FtZSBsZXZlbCBvZiBtdWx0aXBsaWVyKQpgYGB7cn0Kbm9kZV9zaXplX211bHRpcGxpZXIgPSAwLjMgIyBzY2FsZSB1cCBvciBkb3duIG5vZGUgc2l6ZXMKbm9kZV9wb3NpdGlvbl9tdWx0aXBsaWVyID0gMSAjIHpvb20gaW4gb3Igb3V0IG5vZGUgcG9zaXRpb25zCnBvaW50X3Bvc2l0aW9uX211bHRpcGxpZXIgPSAxICMgem9vbSBpbiBvciBvdXQgdGhlIHBvaW50IHBvc2l0aW9ucwplZGdlX2Fycm93X3NhdHVyYXRpb25fbXVsdGlwbGllciA9IDEuNSAjIGFkanVzdCB0aGUgY2hldnJvbiBjb2xvciBsaWdodGVyIG9yIGRhcmtlcgplZGdlX3NpemVfbXVsdGlwbGllciA9IDEgIyBzY2FsZSB1cCBvciBkb3duIGVkZ2Ugc2l6ZXMKYGBgCgoKTW9kZWwgMTogZGVzaWduIGFjdGlvbiBjb2RlcwoKUGxvdCAxOiBNZWFuIE5ldHdvcmsKCmBgYHtyfQpwbG90KHNldF8xLCB0aXRsZSA9ICJPdmVyYWxsIE1lYW4iKSB8PgogIHVuaXRzKAogICAgcG9pbnRzPSBzZXRfMSRwb2ludHMsIAogICAgcG9pbnRfcG9zaXRpb25fbXVsdGlwbGllciA9IHBvaW50X3Bvc2l0aW9uX211bHRpcGxpZXIsCiAgICBwb2ludHNfY29sb3IgPSBjKCJibGFjayIpLAogICAgc2hvd19tZWFuID0gVFJVRSwgc2hvd19wb2ludHMgPSBUUlVFLCB3aXRoX2NpID0gVFJVRSkgfD4KICBlZGdlcygKICAgIHdlaWdodHMgPXNldF8xJGxpbmUud2VpZ2h0cywKICAgIGVkZ2Vfc2l6ZV9tdWx0aXBsaWVyID0gZWRnZV9zaXplX211bHRpcGxpZXIsCiAgICBlZGdlX2Fycm93X3NhdHVyYXRpb25fbXVsdGlwbGllciA9IGVkZ2VfYXJyb3dfc2F0dXJhdGlvbl9tdWx0aXBsaWVyLAogICAgbm9kZV9wb3NpdGlvbl9tdWx0aXBsaWVyID0gbm9kZV9wb3NpdGlvbl9tdWx0aXBsaWVyLAogICAgZWRnZV9jb2xvciA9IGMoImJsYWNrIikpIHw+CiAgbm9kZXMoCiAgICBub2RlX3NpemVfbXVsdGlwbGllciA9IG5vZGVfc2l6ZV9tdWx0aXBsaWVyLAogICAgbm9kZV9wb3NpdGlvbl9tdWx0aXBsaWVyID0gbm9kZV9wb3NpdGlvbl9tdWx0aXBsaWVyLAogICAgbm9kZV9sYWJlbHMgPSBUUlVFLCAjIGNoYW5nZSB0aGlzIHRvIEZBTFNFIGNhbiByZW1vdmUgbm9kZSBsYWJlbHMgaW4gY2FzZSB5b3Ugd2FudCB0byBhZGQgdGhlbSBiYWNrIGluIGEgbmljZXIgZm9udCBvciBzaXplIGZvciB5b3VyIHByZXNlbnRhdGlvbnMgb3IgcHVibGljYXRpb25zCiAgICBzZWxmX2Nvbm5lY3Rpb25fY29sb3IgPSBjKCJibGFjayIpKQpgYGAKClBsb3QgMjogQWxsIE1lYW5zCmBgYHtyfQoKI2dldCBsaXN0IG9mIHRpbWUgcGhhc2VzIGFuZCBncm91cHMgbG9vcCBvdmVyIG9yIHVzZSBtYXAgZnVuY3Rpb24KCnBoYXNlcyA9IHVuaXF1ZShzZXRfMSRwb2ludHMkVGltZVBoYXNlKQoKZ3JvdXBzID0gdW5pcXVlKHNldF8xJHBvaW50cyRSb2xlKQoKIyBjb2xfbGlzdCA9IGxpc3QocGQgPSBsaXN0KCJkYXJrb2xpdmVncmVlbjIiLCJkYXJrb2xpdmVncmVlbjMiLCJkYXJrb2xpdmVncmVlbjQiKSwKIyAgICAgICAgICAgICAgICAgZW4gPSBsaXN0KCJkYXJrb3JhbmdlMiIsImRhcmtvcmFuZ2UzIiwiZGFya29yYW5nZTQiKSwKIyAgICAgICAgICAgICAgICAgc2QgPSBsaXN0KCJkYXJrb3JjaGlkMSIsImRhcmtvcmNoaWQyIiwiZGFya29yY2hpZDMiKSkKCmNvbF9saXN0XzIgPSBjKCJyZWQiLAogICAgICAgICAgICAgICJibHVlIiwKICAgICAgICAgICAgICAiZ3JlZW4iKQoKIyBwZF9jb2xvcnMgPSBjKCJkYXJrb2xpdmVncmVlbjIiLCAiZGFya29saXZlZ3JlZW4zIiwiZGFya29saXZlZ3JlZW40IikKIyAKIyBlbl9jb2xvcnMgPSBjKCJkYXJrb3JhbmdlMiIsImRhcmtvcmFuZ2UzIiwiZGFya29yYW5nZTQiKQojIAojIHNkX2NvbG9ycyA9IGMoImRhcmtvcmNoaWQxIiwiZGFya29yY2hpZDIiLCJkYXJrb3JjaGlkMyIpCgp4ID0gcGxvdChzZXRfMSwgdGl0bGUgPSAiR3JvdXAgTWVhbnMgYnkgUGhhc2UiKQoKZm9yIChpIGluIDE6bGVuZ3RoKHBoYXNlcykpewogIGZvciAoaiBpbiAxOmxlbmd0aChncm91cHMpKXsKICAgIHBvaW50cyA9IHNldF8xJHBvaW50cyAlPiUgZmlsdGVyKFRpbWVQaGFzZSA9PSBwaGFzZXNbaV0sIFJvbGUgPT0gZ3JvdXBzW2pdKQogICAgI3ByaW50KGhlYWQocG9pbnRzKSkKICAgIHggPSB4IHw+CiAgICAgIHVuaXRzKAogICAgICAgIHBvaW50cyA9IHBvaW50cywKICAgICAgICBwb2ludF9wb3NpdGlvbl9tdWx0aXBsaWVyID0gcG9pbnRfcG9zaXRpb25fbXVsdGlwbGllciwKICAgICAgICBwb2ludHNfY29sb3IgPSBjb2xfbGlzdF8yW2ldLAogICAgICAgIHNob3dfbWVhbiA9IFRSVUUsIHNob3dfcG9pbnRzID0gRiwgd2l0aF9jaSA9IEZBTFNFCiAgICAgICAgKSB8PgogICAgICBub2Rlcyhub2RlX3NpemVfbXVsdGlwbGllciA9IDAuMywKICAgICAgICAgICAgbm9kZV9wb3NpdGlvbl9tdWx0aXBsaWVyID0gbm9kZV9wb3NpdGlvbl9tdWx0aXBsaWVyLAogICAgICAgICAgICBzZWxmX2Nvbm5lY3Rpb25fY29sb3IgPSBjKCJibGFjayIpKQogICAgCiAgICAKICAgICN8PgogICAgICMgcGxvdGx5OjpsYXlvdXQoc2hvd2xlZ2VuZCA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICMgbGVnZW5kID0gbGlzdCh4ID0gMTAwLCB5ID0gMC45KQogICAgICAgICAgICAgICAgICAgIyAgKSB8PgogICAgICAjcGxvdGx5OjpzdHlsZShuYW1lID0gInRlc3QiKQogIH0KfQoKCgoKI3ggfD4gbm9kZXMoc2VsZl9jb25uZWN0aW9uX2NvbG9yID0gImJsYWNrIikgCngKCgogICAgICAKIyB4ID0gcGxvdChzZXRfMSwgdGl0bGUgPSAiR3JvdXAgTWVhbnMgYnkgUGhhc2UiKQojIHBvaW50cyA9IHNldF8xJHBvaW50cyAlPiUgZmlsdGVyKFRpbWVQaGFzZSA9PSAxLCBSb2xlID09ICJFbmdpbmVlciIpCiMgCiMgeCB8PgojICAgdW5pdHMoCiMgICAgIHBvaW50cz0gcG9pbnRzLAojICAgICBwb2ludF9wb3NpdGlvbl9tdWx0aXBsaWVyID0gcG9pbnRfcG9zaXRpb25fbXVsdGlwbGllciwKIyAgICAgcG9pbnRzX2NvbG9yID0gImRhcmtvbGl2ZWdyZWVuMiIsCiMgICAgIHNob3dfbWVhbiA9IFRSVUUsIHNob3dfcG9pbnRzID0gVFJVRSwgd2l0aF9jaSA9IFRSVUUpCmBgYAoKCgoKClN0YXRzOgoKYGBge3J9CnJlZ19kYXQgPSBzZXRfMSRwb2ludHMgJT4lIGZpbHRlcihFTkFfRElSRUNUSU9OID09ICJyZXNwb25zZSIpCgptb2RfeCA9IGxtKFNWRDEgfiBhcy5mYWN0b3IoVGltZVBoYXNlKSArIFJvbGUsIGRhdGEgPSByZWdfZGF0KQptb2RfeSA9IGxtKFNWRDIgfiBhcy5mYWN0b3IoVGltZVBoYXNlKSArIFJvbGUsIGRhdGEgPSByZWdfZGF0KQoKCnN1bW1hcnkobW9kX3gpCnN1bW1hcnkobW9kX3kpCgpgYGAKCk1hcmdpbmFsIG1lYW5zIC0geAoKYGBge3J9CmxpYnJhcnkoZW1tZWFucykKCmVtbTEgPSBlbW1lYW5zKG1vZF94LCBzcGVjcyA9IHBhaXJ3aXNlIH4gVGltZVBoYXNlfFJvbGUsIHdlaWdodHMgPSAicHJvcG9ydGlvbmFsIikKI2VtbTEgPSBlbW1lYW5zKG1vZF94LCB+IFJvbGUqVGltZVBoYXNlKQojZW1tMSRlbW1lYW5zCmVtbTEkY29udHJhc3RzCgojd3JpdGUuY3N2KGVtbTEkY29udHJhc3RzLCJlbW1fMV94LmNzdiIpCgpgYGAKCk1hcmdpbmFsIG1lYW5zIC0geQpgYGB7cn0KZW1tMiA9IGVtbWVhbnMobW9kX3ksIHNwZWNzID0gcGFpcndpc2UgfiBSb2xlOlRpbWVQaGFzZSwgd2VpZ2h0cyA9ICJwcm9wb3J0aW9uYWwiKQojZW1tMSA9IGVtbWVhbnMobW9kX3gsIH4gUm9sZSpUaW1lUGhhc2UpCmVtbTIkZW1tZWFucwplbW0yJGNvbnRyYXN0cwp3cml0ZS5jc3YoZW1tMiRjb250cmFzdHMsImVtbV8xX3kuY3N2IikKYGBgCgpDYWxjdWxhdGUgZWZmIHNpemVzCmBgYHtyfQoKYGBgCgpQbG90IG5ldHdvcmsgc3VidHJhY3Rpb25zIGZvciBtb2RlcmF0ZSB0byBoaWdoIGVmZiBzaXplcwpgYGB7cn0KCmBgYAoKTW9kZWwgMjogRXBpc3RlbWljIEFnZW5jeSBDb2RlcwoKUGxvdCAxOiBNZWFuIE5ldHdvcmsKCmBgYHtyfQpwbG90KHNldF8yLCB0aXRsZSA9ICJPdmVyYWxsIE1lYW4tLUFnZW5jeSIpIHw+CiAgdW5pdHMoCiAgICBwb2ludHM9IHNldF8yJHBvaW50cywgCiAgICBwb2ludF9wb3NpdGlvbl9tdWx0aXBsaWVyID0gcG9pbnRfcG9zaXRpb25fbXVsdGlwbGllciwKICAgIHBvaW50c19jb2xvciA9IGMoImJsYWNrIiksCiAgICBzaG93X21lYW4gPSBUUlVFLCBzaG93X3BvaW50cyA9IFRSVUUsIHdpdGhfY2kgPSBUUlVFKSB8PgogIGVkZ2VzKAogICAgd2VpZ2h0cyA9c2V0XzIkbGluZS53ZWlnaHRzLAogICAgZWRnZV9zaXplX211bHRpcGxpZXIgPSBlZGdlX3NpemVfbXVsdGlwbGllciwKICAgIGVkZ2VfYXJyb3dfc2F0dXJhdGlvbl9tdWx0aXBsaWVyID0gZWRnZV9hcnJvd19zYXR1cmF0aW9uX211bHRpcGxpZXIsCiAgICBub2RlX3Bvc2l0aW9uX211bHRpcGxpZXIgPSBub2RlX3Bvc2l0aW9uX211bHRpcGxpZXIsCiAgICBlZGdlX2NvbG9yID0gYygiYmxhY2siKSkgfD4KICBub2RlcygKICAgIG5vZGVfc2l6ZV9tdWx0aXBsaWVyID0gbm9kZV9zaXplX211bHRpcGxpZXIsCiAgICBub2RlX3Bvc2l0aW9uX211bHRpcGxpZXIgPSBub2RlX3Bvc2l0aW9uX211bHRpcGxpZXIsCiAgICBub2RlX2xhYmVscyA9IFRSVUUsICMgY2hhbmdlIHRoaXMgdG8gRkFMU0UgY2FuIHJlbW92ZSBub2RlIGxhYmVscyBpbiBjYXNlIHlvdSB3YW50IHRvIGFkZCB0aGVtIGJhY2sgaW4gYSBuaWNlciBmb250IG9yIHNpemUgZm9yIHlvdXIgcHJlc2VudGF0aW9ucyBvciBwdWJsaWNhdGlvbnMKICAgIHNlbGZfY29ubmVjdGlvbl9jb2xvciA9IGMoImJsYWNrIikpCmBgYAoKUGxvdCAyOiBBbGwgTWVhbnMKYGBge3J9CgojZ2V0IGxpc3Qgb2YgdGltZSBwaGFzZXMgYW5kIGdyb3VwcyBsb29wIG92ZXIgb3IgdXNlIG1hcCBmdW5jdGlvbgoKcGhhc2VzID0gdW5pcXVlKHNldF8yJHBvaW50cyRUaW1lUGhhc2UpCgpncm91cHMgPSB1bmlxdWUoc2V0XzIkcG9pbnRzJFJvbGUpCgojIGNvbF9saXN0ID0gbGlzdChwZCA9IGxpc3QoImRhcmtvbGl2ZWdyZWVuMiIsImRhcmtvbGl2ZWdyZWVuMyIsImRhcmtvbGl2ZWdyZWVuNCIpLAojICAgICAgICAgICAgICAgICBlbiA9IGxpc3QoImRhcmtvcmFuZ2UyIiwiZGFya29yYW5nZTMiLCJkYXJrb3JhbmdlNCIpLAojICAgICAgICAgICAgICAgICBzZCA9IGxpc3QoImRhcmtvcmNoaWQxIiwiZGFya29yY2hpZDIiLCJkYXJrb3JjaGlkMyIpKQoKY29sX2xpc3RfMiA9IGMoInJlZCIsCiAgICAgICAgICAgICAgImJsdWUiLAogICAgICAgICAgICAgICJncmVlbiIpCgp4X2FnZW5jeSA9IHBsb3Qoc2V0XzIsIHRpdGxlID0gIkdyb3VwIE1lYW5zIGJ5IFBoYXNlIC0tIEFnZW5jeSIpCgpmb3IgKGkgaW4gMTpsZW5ndGgocGhhc2VzKSl7CiAgZm9yIChqIGluIDE6bGVuZ3RoKGdyb3VwcykpewogICAgcG9pbnRzID0gc2V0XzIkcG9pbnRzICU+JSBmaWx0ZXIoVGltZVBoYXNlID09IHBoYXNlc1tpXSwgUm9sZSA9PSBncm91cHNbal0pCiAgICAjcHJpbnQoaGVhZChwb2ludHMpKQogICAgeF9hZ2VuY3kgPSB4X2FnZW5jeSB8PgogICAgICB1bml0cygKICAgICAgICBwb2ludHMgPSBwb2ludHMsCiAgICAgICAgcG9pbnRfcG9zaXRpb25fbXVsdGlwbGllciA9IHBvaW50X3Bvc2l0aW9uX211bHRpcGxpZXIsCiAgICAgICAgcG9pbnRzX2NvbG9yID0gY29sX2xpc3RfMltpXSwKICAgICAgICBzaG93X21lYW4gPSBUUlVFLCBzaG93X3BvaW50cyA9IEYsIHdpdGhfY2kgPSBGQUxTRQogICAgICAgICkgfD4KICAgICAgbm9kZXMobm9kZV9zaXplX211bHRpcGxpZXIgPSAwLjMsCiAgICAgICAgICAgIG5vZGVfcG9zaXRpb25fbXVsdGlwbGllciA9IG5vZGVfcG9zaXRpb25fbXVsdGlwbGllciwKICAgICAgICAgICAgc2VsZl9jb25uZWN0aW9uX2NvbG9yID0gYygiYmxhY2siKSkKICAgIAogICAgCiAgICAjfD4KICAgICAjIHBsb3RseTo6bGF5b3V0KHNob3dsZWdlbmQgPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAjIGxlZ2VuZCA9IGxpc3QoeCA9IDEwMCwgeSA9IDAuOSkKICAgICAgICAgICAgICAgICAgICMgICkgfD4KICAgICAgI3Bsb3RseTo6c3R5bGUobmFtZSA9ICJ0ZXN0IikKICB9Cn0KCnhfYWdlbmN5CmBgYAoKYGBge3J9CnJlZ19kYXRfYWdlbmN5ID0gc2V0XzIkcG9pbnRzICU+JSBmaWx0ZXIoRU5BX0RJUkVDVElPTiA9PSAicmVzcG9uc2UiKQoKbW9kX3hfYWdlbmN5ID0gbG0oU1ZEMSB+IGFzLmZhY3RvcihUaW1lUGhhc2UpICsgUm9sZSwgZGF0YSA9IHJlZ19kYXRfYWdlbmN5KQptb2RfeV9hZ2VuY3kgPSBsbShTVkQyIH4gYXMuZmFjdG9yKFRpbWVQaGFzZSkgKyBSb2xlLCBkYXRhID0gcmVnX2RhdF9hZ2VuY3kpCgoKc3VtbWFyeShtb2RfeF9hZ2VuY3kpCnN1bW1hcnkobW9kX3lfYWdlbmN5KQpgYGAKTWFyZ2luYWwgbWVhbnMgLSB4CgpgYGB7cn0KbGlicmFyeShlbW1lYW5zKQoKZW1tMV9hZ2VuY3kgPSBlbW1lYW5zKG1vZF94X2FnZW5jeSwgc3BlY3MgPSBwYWlyd2lzZSB+IFJvbGU6VGltZVBoYXNlLCB3ZWlnaHRzID0gInByb3BvcnRpb25hbCIpCiNlbW0xID0gZW1tZWFucyhtb2RfeCwgfiBSb2xlKlRpbWVQaGFzZSkKI2VtbTEkZW1tZWFucwojZW1tMV9hZ2VuY3kkY29udHJhc3RzCgp3cml0ZS5jc3YoZW1tMV9hZ2VuY3kkY29udHJhc3RzLCJlbW1feF9hZ2VuY3kuY3N2IikKCmBgYAoKTWFyZ2luYWwgbWVhbnMgLSB5CmBgYHtyfQplbW0yID0gZW1tZWFucyhtb2RfeV9hZ2VuY3ksIHNwZWNzID0gcGFpcndpc2UgfiBSb2xlOlRpbWVQaGFzZSwgd2VpZ2h0cyA9ICJwcm9wb3J0aW9uYWwiKQojZW1tMSA9IGVtbWVhbnMobW9kX3gsIH4gUm9sZSpUaW1lUGhhc2UpCiNlbW0yJGVtbWVhbnMKI2VtbTIkY29udHJhc3RzCndyaXRlLmNzdihlbW0yJGNvbnRyYXN0cywiZW1tX3lfYWdlbmN5LmNzdiIpCmBgYAoKQ2FsY3VsYXRlIGVmZiBzaXplcwpgYGB7cn0KCmBgYAoKUGxvdCBuZXR3b3JrIHN1YnRyYWN0aW9ucyBmb3IgbW9kZXJhdGUgdG8gaGlnaCBlZmYgc2l6ZXMKYGBge3J9CgpgYGAKCgo=